/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Abastecimiento;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.PdfPTable;
import commonsbeans.ApplicationBean;
import commonsbeans.SessionBean;
import commonsbridges.MaterialConstruccionProveedor;
import entities.*;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import persistence.*;
import persistence.exceptions.IllegalOrphanException;
import persistence.exceptions.NonexistentEntityException;
import persistence.exceptions.PreexistingEntityException;
import persistence.exceptions.RollbackFailureException;

/**
 *
 * @author Felipe Duarte
 */
@ManagedBean
@ViewScoped
public class GestionarMaterialConstruccion implements Serializable {

    @ManagedProperty(value = "#{sessionBean}")
    private SessionBean sessionBean;
    @ManagedProperty(value = "#{applicationBean}")
    private ApplicationBean applicationBean;
    private MaterialConstruccionJpaController materialConstruccionJpaController = null;
    private MedidaMaterialJpaController medidaMaterialJpaController = null;
    private TipoMaterialJpaController tipoMaterialJpaController = null;
    private HistoricoCompraJpaController historicoCompraJpaController = null;
    private ProveedorMaterialConstruccionJpaController proveedorMaterialConstruccionJpaController = null;
    private ProveedorJpaController proveedorJpaController=null;
    public List<Proveedor> listaProveedores = new ArrayList<Proveedor>();
    public List<TipoMaterial> listaTipoMaterial = new ArrayList<TipoMaterial>();
    public List<MedidaMaterial> listaMateriales = new ArrayList<MedidaMaterial>();
    public MaterialConstruccion materialConstruccion = new MaterialConstruccion();
    public ProveedorConstruccionJpaController proveedorConstruccionJpaController = new ProveedorConstruccionJpaController();
    public ProveedorMaterialConstruccion proveedorMaterialConstruccion = new ProveedorMaterialConstruccion();
    public List<MaterialConstruccionProveedor> listaAgregada = new ArrayList<MaterialConstruccionProveedor>();
    public MaterialConstruccionProveedor materialConstruccionselected = new MaterialConstruccionProveedor();
    private boolean editar = false;

    public GestionarMaterialConstruccion() {
    }

    //Constructor
    @PostConstruct
    public void init() {
        if (sessionBean.getUsuarioActual() != null) {
            initControllers();
            cargarProveedores();
            cargarMedidasMaterial();
            cargarTipoMaterial();
            cargarResumenMaterial();
        }

    }

    //<editor-fold defaultstate="collapsed" desc="Funcionalidades">
    
    /**
     * Metodo para cargar el resumen de materiales registrados, discriminando
     * estos materiales por la ciudad del usuario logueado, se hace uso de una
     * clase alterna para mostrar los datos de los proveedores
     * @see MaterialConstruccionProveedor
     *
     */
    private void cargarResumenMaterial() {
        listaAgregada = new ArrayList<MaterialConstruccionProveedor>();
        List<MaterialConstruccion> listaMaterialBase = new ArrayList<MaterialConstruccion>();
        MaterialConstruccionProveedor mcp = new MaterialConstruccionProveedor();
        MaterialConstruccion mc = new MaterialConstruccion();
        ProveedorMaterialConstruccion pmc = new ProveedorMaterialConstruccion();
        listaMaterialBase = materialConstruccionJpaController.getMaterialPorCiudad(sessionBean.getUsuarioActual().getCiudadIdCiudad());
        for (int i = 0; i < listaMaterialBase.size(); i++) {
            mc = listaMaterialBase.get(i);
            pmc = proveedorMaterialConstruccionJpaController.getProveedorPorMaterial(mc);
            mcp = new MaterialConstruccionProveedor();
            mcp.setMaterialConstruccion(mc);
            mcp.setProveedorMaterialConstruccion(pmc);
            listaAgregada.add(mcp);
        }

    }

    public void actualizarInformacion(){
     cargarProveedores();
     cargarResumenMaterial();
    }
  

    /**
     * Carga de las medidas de materiales
     *
     */
    private void cargarMedidasMaterial() {
        listaMateriales = medidaMaterialJpaController.findMedidaMaterialEntities();
    }

    /**
     * Carga de las medidas de materiales
     *
     */
    private void cargarTipoMaterial() {
        listaTipoMaterial = tipoMaterialJpaController.findTipoMaterialEntities();
        TipoMaterial tm = tipoMaterialJpaController.findTipoMaterial(4);
        listaTipoMaterial.remove(tm);
    }

    /**
     * Carga los proveedores
     *
     */
    private void cargarProveedores() {
        listaProveedores.clear();
        listaProveedores = proveedorJpaController.getProveedorPorCiudadAbastecimientoHabilitados(sessionBean.getUsuarioActual().getCiudadIdCiudad());
    }

    /**
     * Metodo para crear los materiales de la construccion, ademas verifica si
     * se esta editando un material o si se esta creando, si se esta editando
     * hace el llamado a otro metodo de actualizar
     *
     * @see MaterialConstruccionProveedor
     * @see editarMaterial
     */
    public void guardarMaterialConstruccion() {
        if (editar == false) {
            try {
                MaterialConstruccionProveedor mcp = new MaterialConstruccionProveedor();
                mcp.setMaterialConstruccion(materialConstruccion);
                mcp.getMaterialConstruccion().setCantidadDisponible(mcp.getMaterialConstruccion().getCantidadTotal());
                int idMaterialConstruccion = 0;
                if (!materialConstruccionJpaController.findMaterialConstruccionEntities().isEmpty()) {
                    idMaterialConstruccion = materialConstruccionJpaController.getIdMax();
                }
                idMaterialConstruccion++;
                mcp.getMaterialConstruccion().setIdMaterialConstruccion(idMaterialConstruccion);
                mcp.getMaterialConstruccion().setCiudadIdCiudad(sessionBean.getUsuarioActual().getCiudadIdCiudad());
                materialConstruccionJpaController.create(mcp.getMaterialConstruccion());
                mcp.setProveedorMaterialConstruccion(proveedorMaterialConstruccion);
                guardarHistoricoCompra(idMaterialConstruccion);
                guardarProveedorMaterialConstruccion();
                listaAgregada.add(mcp);
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(GestionarMaterialConstruccion.class.getName()).log(Level.SEVERE, null, ex);
            } catch (RollbackFailureException ex) {
                Logger.getLogger(GestionarMaterialConstruccion.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(GestionarMaterialConstruccion.class.getName()).log(Level.SEVERE, null, ex);
            }

        } else {
            editarMaterial();
        }
        limpiarCampos();
        showSuccessMessage("Se ha guardado el material de manera éxitosa");
        cargarResumenMaterial();
        editar=false;
    }

    /**
     * Metodo para actualizar un material de construccion
     *
     */
    public void editarMaterial() {
        try {
            ProveedorMaterialConstruccion pmc = new ProveedorMaterialConstruccion();
            pmc.setIdProveedorMaterialConstruccion(materialConstruccion.getProveedorMaterialConstruccionList().get(0).getIdProveedorMaterialConstruccion());
            pmc.setProveedorIdProveedor(proveedorMaterialConstruccion.getProveedorIdProveedor());
            pmc.setMaterialConstruccionIdMaterialConstruccion(materialConstruccion);
            List<ProveedorMaterialConstruccion> pc = new ArrayList<ProveedorMaterialConstruccion>();
            pc.add(pmc);
            materialConstruccion.getProveedorMaterialConstruccionList().set(0, pmc);
            proveedorMaterialConstruccionJpaController.edit(materialConstruccion.getProveedorMaterialConstruccionList().get(0));
            int total = (materialConstruccionJpaController.findMaterialConstruccion(materialConstruccion.getIdMaterialConstruccion())).getCantidadTotal() + materialConstruccion.getCantidadTotal();
            int disponible = (materialConstruccionJpaController.findMaterialConstruccion(materialConstruccion.getIdMaterialConstruccion())).getCantidadDisponible() + materialConstruccion.getCantidadTotal();
            materialConstruccion.setCantidadDisponible(disponible);
            materialConstruccion.setCantidadTotal(total);
            materialConstruccionJpaController.edit(materialConstruccion);

        } catch (IllegalOrphanException ex) {
            Logger.getLogger(GestionarMaterialConstruccion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(GestionarMaterialConstruccion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(GestionarMaterialConstruccion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GestionarMaterialConstruccion.class.getName()).log(Level.SEVERE, null, ex);
        }
        editar=false;
    }

    /**
     * Al crear o actualizar un material de construccion, este metodo guardaun
     * historico en la base de datos
     *
     */
    private void guardarHistoricoCompra(int idMaterial) throws PreexistingEntityException, RollbackFailureException, Exception {
        HistoricoCompra hc = new HistoricoCompra();
        hc.setTipoMaterialHistoricoCompra(materialConstruccion.getTipoMaterialIdTipoMaterial().getNombreTipoMaterial());
        hc.setNombreProductoHistoricoCompra(materialConstruccion.getNombreMaterial());
        hc.setCantidadHistoricoCompra(materialConstruccion.getCantidadTotal());
        hc.setFechaHistoricoCompra(applicationBean.getFechaActual());
        hc.setCiudadIdCiudad(sessionBean.getUsuarioActual().getCiudadIdCiudad());

        int hcId = 0;
        if (!historicoCompraJpaController.findHistoricoCompraEntities().isEmpty()) {
            hcId = historicoCompraJpaController.getIdMax();
        }
        hcId++;
        hc.setIdHistoricoCompra(hcId);
        historicoCompraJpaController.create(hc);
        editar=false;
    }

    /**
     * Metodo para recoger el valor del material seleccionado en el resumen de
     * la vista
     *
     */
    public void rowSelected() {
        materialConstruccion = materialConstruccionselected.getMaterialConstruccion();
        proveedorMaterialConstruccion.setProveedorIdProveedor(materialConstruccionselected.getProveedorMaterialConstruccion().getProveedorIdProveedor());
        editar = true;
    }

    /**
     * Metodo para soltar el valor del material seleccionado en el resumen de la
     * vista
     *
     */
    public void onRow() {
        materialConstruccionselected = new MaterialConstruccionProveedor();
        materialConstruccion = new MaterialConstruccion();
        proveedorMaterialConstruccion = new ProveedorMaterialConstruccion();
        editar = false;

    }

    /**
     * Metodo para guardar en la tabla Proveedor Material Construccion, tabla
     * que es intermedia entre la relacion muchos a muchos de las tablas;
     * material_construccion y proveedor
     *
     */
    private void guardarProveedorMaterialConstruccion() {
        try {
            ProveedorMaterialConstruccion pmc = new ProveedorMaterialConstruccion();
            int idpmc = 0;
            idpmc = proveedorMaterialConstruccionJpaController.getIdMax();
            idpmc++;
            pmc.setIdProveedorMaterialConstruccion(idpmc);
            pmc.setMaterialConstruccionIdMaterialConstruccion(materialConstruccion);
            pmc.setProveedorIdProveedor(proveedorMaterialConstruccion.getProveedorIdProveedor());
            proveedorMaterialConstruccionJpaController.create(pmc);
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(GestionarMaterialConstruccion.class
                    .getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(GestionarMaterialConstruccion.class
                    .getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GestionarMaterialConstruccion.class
                    .getName()).log(Level.SEVERE, null, ex);
        }
        editar=false;
    }

    /**
     * Metodo para mostrar el mensaje de exito
     **/
    public void showSuccessMessage(String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Operación exitosa", detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    /**
     * Limpia los campos del formulario
     **/
    private void limpiarCampos() {
        materialConstruccion = new MaterialConstruccion();
        proveedorMaterialConstruccion = new ProveedorMaterialConstruccion();
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Getter's y setter's">
    public List<Proveedor> getListaProveedores() {
        return listaProveedores;
    }

    public void setListaProveedores(List<Proveedor> listaProveedores) {
        this.listaProveedores = listaProveedores;
    }

    public ProveedorMaterialConstruccion getProveedorMaterialConstruccion() {
        return proveedorMaterialConstruccion;
    }

    public void setProveedorMaterialConstruccion(ProveedorMaterialConstruccion proveedorMaterialConstruccion) {
        this.proveedorMaterialConstruccion = proveedorMaterialConstruccion;
    }

    public SessionBean getSessionBean() {
        return sessionBean;
    }

    public void setSessionBean(SessionBean sessionBean) {
        this.sessionBean = sessionBean;
    }

    public List<TipoMaterial> getListaTipoMaterial() {
        return listaTipoMaterial;
    }

    public void setListaTipoMaterial(List<TipoMaterial> listaTipoMaterial) {
        this.listaTipoMaterial = listaTipoMaterial;
    }

    public List<MedidaMaterial> getListaMateriales() {
        return listaMateriales;
    }

    public void setListaMateriales(List<MedidaMaterial> listaMateriales) {
        this.listaMateriales = listaMateriales;
    }

    public MaterialConstruccion getMaterialConstruccion() {
        return materialConstruccion;
    }

    public void setMaterialConstruccion(MaterialConstruccion materialConstruccion) {
        this.materialConstruccion = materialConstruccion;
    }

    public List<MaterialConstruccionProveedor> getListaAgregada() {
        return listaAgregada;
    }

    public void setListaAgregada(List<MaterialConstruccionProveedor> listaAgregada) {
        this.listaAgregada = listaAgregada;
    }

    public ApplicationBean getApplicationBean() {
        return applicationBean;
    }

    public void setApplicationBean(ApplicationBean applicationBean) {
        this.applicationBean = applicationBean;
    }

    public MaterialConstruccionProveedor getMaterialConstruccionselected() {
        return materialConstruccionselected;
    }

    public void setMaterialConstruccionselected(MaterialConstruccionProveedor materialConstruccionselected) {
        this.materialConstruccionselected = materialConstruccionselected;
    }

    //</editor-fold>
    
    
    //<editor-fold defaultstate="collapsed" desc="Inicializar los controladores">
    public void initControllers() {
        FacesContext context = FacesContext.getCurrentInstance();
        materialConstruccionJpaController = (MaterialConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "materialConstruccionJpaController");
        medidaMaterialJpaController = (MedidaMaterialJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "medidaMaterialJpaController");
        tipoMaterialJpaController = (TipoMaterialJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "tipoMaterialJpaController");
        proveedorMaterialConstruccionJpaController = (ProveedorMaterialConstruccionJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "proveedorMaterialConstruccionJpaController");
        historicoCompraJpaController = (HistoricoCompraJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "historicoCompraJpaController");
        proveedorJpaController= (ProveedorJpaController) context.getELContext().getELResolver().getValue(context.getELContext(), null, "proveedorJpaController");
    }
    //</editor-fold>
}
